package view;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import model.Richting;
import model.BeweegVijand;
import model.Opties;
import java.util.ArrayList;
/**
 *
 * @author Alvin & Roy
 */
public class Main extends javax.swing.JFrame {
    /** De spelomgeving */
    private SpelOmgeving spelOmgeving;
    /** Het aantal verticale velden */
    private int verticaleVelden = 30;
    /** Het aantal horizontale velden */
    private int horizontaleVelden = 30;
    /** Breedte van een knop */
    private final int BTNWIDTH  = SpelOmgeving.getVeldgrootte() * 9;
    /** Hoogte van een knop */
    private final int BTNHEIGTH = SpelOmgeving.getVeldgrootte() * 3;
    /** Grootte van de besturingsknoppen */
    private final int BESTUURGROOTE = SpelOmgeving.getVeldgrootte() * 3;
    /** De vijand threads */
    private ArrayList<BeweegVijand> vijandThreads;
    /** Spel gestart */
    private boolean gameStarted;

    /** Constructor */
    public Main() {
        initComponents();
        ButtonListener buttonListener = new ButtonListener(this);
        //set window maximized
        this.setExtendedState(this.getExtendedState()|javax.swing.JFrame.MAXIMIZED_BOTH);

        //stel de standaard moeilijkheid in (makkelijkst)
        Opties.setMoeilijkheidsgraad(1);

        //stel standaard wereld met randen in
        Opties.setRanden(true);

        //stel standaard geen visualiseer route in
        Opties.setShowPath(false);

        //stel de grootte in
        Opties.setXSize(horizontaleVelden);
        Opties.setYSize(verticaleVelden);

        //maak de vijandthread arraylist aan
        vijandThreads = new ArrayList<BeweegVijand>();

        //create new Spel Omgeving
        spelOmgeving = new SpelOmgeving(verticaleVelden,horizontaleVelden);

        //maak de knoppen
        btnStart = new JButton();
        btnStart.setSize(BTNWIDTH, BTNHEIGTH);
        btnStart.addActionListener(buttonListener);
        btnStart.setText("NEW GAME");
        btnStart.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), 0);

        btnPauze = new JButton();
        btnPauze.setSize(BTNWIDTH, BTNHEIGTH);
        btnPauze.addActionListener(buttonListener);
        btnPauze.setText("PAUZE");
        btnPauze.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), BTNHEIGTH  + spelOmgeving.getVeldgrootte());

        btnStop =  new JButton();
        btnStop.setSize(BTNWIDTH, BTNHEIGTH);
        btnStop.addActionListener(buttonListener);
        btnStop.setText("STOP");
        btnStop.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), BTNHEIGTH * 2 + spelOmgeving.getVeldgrootte() * 2);


        btnOmhoog =  new JButton();
        btnOmhoog.setSize(BESTUURGROOTE, BESTUURGROOTE);
        btnOmhoog.addActionListener(buttonListener);
        btnOmhoog.setText("^");
        btnOmhoog.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte() + BESTUURGROOTE, BESTUURGROOTE * 4 + spelOmgeving.getVeldgrootte() * 4);

        btnOmlaag =  new JButton();
        btnOmlaag.setSize(BESTUURGROOTE, BESTUURGROOTE);
        btnOmlaag.addActionListener(buttonListener);
        btnOmlaag.setText("v");
        btnOmlaag.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte() + BESTUURGROOTE, BESTUURGROOTE * 5 + spelOmgeving.getVeldgrootte() * 4);

        btnLinks =  new JButton();
        btnLinks.setSize(BESTUURGROOTE, BESTUURGROOTE);
        btnLinks.addActionListener(buttonListener);
        btnLinks.setText("<");
        btnLinks.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), BESTUURGROOTE * 5 + spelOmgeving.getVeldgrootte() * 4);

        btnRechts =  new JButton();
        btnRechts.setSize(BESTUURGROOTE, BESTUURGROOTE);
        btnRechts.addActionListener(buttonListener);
        btnRechts.setText(">");
        btnRechts.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte() + BESTUURGROOTE * 2, BESTUURGROOTE * 5 + spelOmgeving.getVeldgrootte() * 4);

        this.add(btnStop);
        this.add(btnStart);
        this.add(btnPauze);
        this.add(spelOmgeving);

        this.add(btnOmhoog);
        this.add(btnOmlaag);
        this.add(btnLinks);
        this.add(btnRechts);

        //haal de focus van de knoppen af
        btnStart.setFocusable(false);
        btnPauze.setFocusable(false);
        btnStop.setFocusable(false);

        btnOmhoog.setFocusable(false);
        btnOmlaag.setFocusable(false);
        btnLinks.setFocusable(false);
        btnRechts.setFocusable(false);

        //maak het menu aan
        menu = new MenuBalk(buttonListener);
        this.setJMenuBar(menu);
    }

    /**
     * Maak een nieuwe spel omgeving
     * @param s De spelomgeving
     */
     public void makeNewSpelOmgeving(SpelOmgeving s){
        this.remove(spelOmgeving);
        spelOmgeving = s;
        this.add(spelOmgeving);

        //haal de nieuwe grootte van het speelveld op
        horizontaleVelden = s.getMap().getVelden().length;
        verticaleVelden = s.getMap().getVelden()[0].length;

        //verplaats de knoppen
        btnStart.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), 0);
        btnPauze.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), BTNHEIGTH  + spelOmgeving.getVeldgrootte());
        btnStop.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), BTNHEIGTH * 2 + spelOmgeving.getVeldgrootte() * 2);

        btnOmhoog.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte() + BESTUURGROOTE, BESTUURGROOTE * 4 + spelOmgeving.getVeldgrootte() * 4);
        btnOmlaag.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte() + BESTUURGROOTE, BESTUURGROOTE * 5 + spelOmgeving.getVeldgrootte() * 4);
        btnLinks.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte(), BESTUURGROOTE * 5 + spelOmgeving.getVeldgrootte() * 4);
        btnRechts.setLocation(spelOmgeving.getVeldgrootte() * horizontaleVelden + spelOmgeving.getVeldgrootte() + BESTUURGROOTE * 2, BESTUURGROOTE * 5 + spelOmgeving.getVeldgrootte() * 4);

        


        this.repaint();
    }

    /**
     * Haal de spelomgeving op
     * @return Spelomgeving
     */
    public SpelOmgeving getSpelOmgeving(){
        return spelOmgeving;
    }

    /**
     * Controleer of het spel gewonnen is
     */
    public void checkWinSpel(){
        int aantalVast = 0;
        for(BeweegVijand v : vijandThreads){
            if(v.getVijand().staatVast()){
                aantalVast++;
            }else{
                break;
            }
        }
        if(aantalVast == Opties.getAantalVijanden()){
            winSpel();
        }
    }

    /**
     * Het spel is gewonnen
     */
    public void winSpel(){
        JOptionPane.showMessageDialog(this, "Gefeliciteerd, je hebt gewonnen!!");
        stop();
    }

    /**
     * Voeg een vijand thread toe
     * @param v De vijand thread
     */
    public void addVijandThread(BeweegVijand v){
        vijandThreads.add(v);
    }

    /**
     * Het spel is verloren
     */
    public void verliesSpel(){
        //laat bericht zien
        JOptionPane.showMessageDialog(this, "Helaas, je hebt verloren!!");
        stop();
    }

    /**
     * Controleer of het spel gestart is
     * @return True als het spel gestart is
     */
    public boolean gameStarted(){
        return gameStarted;
    }

    /**
     * Stel de startstatus van het spel in
     * @param s  De status
     */
    public void setGameStartStatus(boolean s){
        gameStarted = s;
    }

   /**
    * beweeg de speler
    * @param r De richting
    */
   public void moveSpeler(Richting r){
       spelOmgeving.getMap().getSpeler().move(r);
   }

   /**
    * Stop het spel
    */
   public void stop(){
        //stop alle vijand threads
        for(BeweegVijand v : vijandThreads){
            v.cancel();
        }
        
        //ga naar default status
        SpelOmgeving s = new SpelOmgeving(Opties.getYSize(),Opties.getXSize());
        makeNewSpelOmgeving(s);
        setGameStartStatus(false);
        vijandThreads.clear();
   }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 424, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 353, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Main().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
    private javax.swing.JButton btnStart;
    private javax.swing.JButton btnStop;
    private javax.swing.JButton btnPauze;

    private javax.swing.JButton btnOmhoog;
    private javax.swing.JButton btnOmlaag;
    private javax.swing.JButton btnLinks;
    private javax.swing.JButton btnRechts;
    
    private MenuBalk menu;
}
